const fs = require('fs');
const os = require('os');
const path = require('path');
const vscode = require('vscode');


const util = {
  /**
   * 获取当前所在工程根目录，有3种使用方法：<br>
   * getProjectPath(uri) uri 表示工程内某个文件的路径<br>
   * getProjectPath(document) document 表示当前被打开的文件document对象<br>
   * getProjectPath() 会自动从 activeTextEditor 拿document对象，如果没有拿到则报错
   * @param {*} document
   */
  getProjectPath(document) {
    if (!document) {
      document = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.document : null;
    }
    if (!document) {
      vscode.window.showErrorMessage('当前激活的编辑器不是文件或者没有文件被打开！');
      return '';
    }
    const currentFile = (document.uri ? document.uri : document).fsPath;
  
    const workspaceFolder = vscode.workspace.getWorkspaceFolder(vscode.Uri.file(path.join(currentFile)));
    const projectPath = workspaceFolder.uri.fsPath;

    if (!projectPath) {
      console.log('获取工程根路径异常！');
      return '';
    }
    return projectPath;
  },
  /**
   * 从某个文件里面查找某个字符串，返回第一个匹配处的行与列，未找到返回第一行第一列
   * @param filePath 要查找的文件
   * @param str 要查找的字符串
   */
  findStrInFile: function ({ filePath, str }) {
    const content = fs.readFileSync(filePath, 'utf-8');
    str = typeof str === 'string' ? new RegExp(str, 'm') : str;
    // 没找到直接返回
    if (content.search(str) < 0) return { row: 0, col: 0 };

    const rows = content.split('\n');
    // 分行查找为了拿到行号和列数
    for (let i = 0; i < rows.length; i++) {
      // 寻找列的位置
      let col = rows[i].search(str);
      if (col >= 0) {
        return { row: i, col};
      }
    }

    return { row: 0, col:0};
  },
  /**
   * 读取properties文件
   * @param {*} filePath
   */
  readProperties(filePath) {
    const content = fs.readFileSync(filePath, 'utf-8');
    let rows = content.split(os.EOL);
    rows = rows.filter((row) => row && row.trim() && !/^#/.test(row));
    const result = {};
    rows.forEach((row) => {
      let temp = row.split('=');
      result[temp[0].trim()] = temp[1].trim();
    });
    return result;
  },
  /**
   * 比较2个对象转JSON字符串后是否完全一样
   * 特别注意，由于JS遍历对象的无序性（部分浏览器是按照添加顺序遍历的）导致同样的对象，
   * 转成JSON串之后反而不一样，所以这里采用其它方式实现。
   * @param {*} obj1
   * @param {*} obj2
   */
  jsonEquals(obj1, obj2) {
    let s1 = this.formatToSpecialJSON(obj1, '', true);
    let s2 = this.formatToSpecialJSON(obj2, '', true);
    return s1 === s2;
  },
};

module.exports = util;
